<?php
/**
* @file SystemConfiguration.php
* Copyright (c) Friends Group. All rights reserved.
* $Id$
*
*/

require_once(realpath(dirname(__FILE__)) . '/DataService.php');
require_once(realpath(dirname(__FILE__)) . '/classes/SystemSetting.php');
require_once(realpath(dirname(__FILE__)) . '/classes/Avatar.php');
require_once(realpath(dirname(__FILE__)) . '/classes/Role.php');

/**
 * Quản lý cấu hình hệ thống
 */
class SystemConfiguration 
{

    public function __construct()
    {
        $this->repo = new DataService();
    }
    
    /**
     * @ReturnType Object
     * @ParamType name 
     * Lấy thông tin của một cấu hình
     */
    public function getSetting($name) 
    {
        $st = $this -> repo -> getFirst("SELECT * FROM SystemSetting WHERE settingName = '$name'", "SystemSetting");
        if($st)
            return $st -> getSettingValue();
        
        return "";
    }
     /**
     * @ReturnType void
     * @ParamType name 
     * @ParamType newValue 
     * Cập nhật một cấu hình
     */
    public function updateSetting($name, $newValue) 
    {
        $st = $this -> repo -> getFirst("SELECT * FROM SystemSetting WHERE settingName = '$name'", "SystemSetting");
        if($st)
        {
            $st -> setSettingValue($newValue);
            $this -> repo -> update($st);
        }
        else
            throw new Exception("Không tìm thấy setting #$name");
    }

    /**
     * @ReturnType void
     * @ParamType name 
     * @ParamType newValue 
     * Tạo mới 1 cấu hình
     */
    public function createSetting($name, $newValue = null) 
    {
        if($this -> isSettingExist($name))
            throw new Exception("Setting đã có trong database!");
        
        $st = new SystemSetting($name, $newValue);
        $this -> repo -> create($st);
    }

    /**
     * @ReturnType Boolean
     * @ParamType name 
     * Kiểm tra xem cấu hình đã có trong database chưa
     */
    public function isSettingExist($name) 
    {
        $st = $this -> repo -> getFirst("SELECT * FROM SystemSetting WHERE settingName = '$name'", "SystemSetting");
        if($st)
            return true;
        else
            return false;
    }

    /**
     * @ParamType name 
     * Xóa cấu hình
     */
    public function deleteSetting($name) 
    {
        $st = $this -> repo -> getFirst("SELECT * FROM SystemSetting WHERE settingName = '$name'", "SystemSetting");
        if($st)
            $this -> repo -> delete($st);
        else
            throw new Exception("Không tìm thấy setting #$name");
    }

    /**
     * @ReturnType void
     * @ParamType newAvatar 
     * Thêm avatar
     */
    public function addNewAvatar($newAvatar) 
    {
        if(get_class($newAvatar) != 'Avatar')
            throw new Exception("Tham số phải là 1 đối tượng Avatar");
        
        $this -> repo -> create($newAvatar);
    }

    public function removeAvatar($avatarId)
    {
        $avatar = $this -> repo -> getFirst("SELECT * FROM Avatar WHERE ID = '$avatarId'", "Avatar");
        if(!$avatar)
            throw new Exception("Không tìm thấy avatar #$avatarId");
        
        $this -> repo -> delete($avatar);
    }
    
    /**
     * @ReturnType void
     * @ParamType newRole 
     * Thêm role
     */
    public function addNewRole($newRole) 
    {
        if(get_class($newRole) != 'Role')
            throw new Exception("Tham số phải là 1 đối tượng Role");
        
        $this -> repo -> create($newRole);
    }

    /**
     * @ReturnType void
     * @ParamType newStatus 
     * Thêm kiểu status
     */
    public function addNewStatus($newStatus) 
    {
        if(get_class($newStatus) != 'Status')
            throw new Exception("Tham số phải là 1 đối tượng Status");
        
        $this -> repo -> create($newStatus);
    }

    /**
     * @ReturnType void
     * @ParamType newType 
     * Thêm kiểu message
     */
    public function addNewMessageType($newType) 
    {
        if(get_class($newType) != 'MessageType')
            throw new Exception("Tham số phải là 1 đối tượng MessageType");
        
        $this -> repo -> create($newType);
    }
}

?>
